/*
 * APICloud JavaScript Library
 * Copyright (c) 2014 apicloud.com
 */
var u = {};
var isAndroid = /android/gi.test(navigator.appVersion);
var uzStorage = function() {
  var ls = window.localStorage;
  if (isAndroid) {
    ls = os.localStorage();
  }
  return ls;
};
function parseArguments(url, data, fnSuc, dataType) {
  if (typeof data == "function") {
    dataType = fnSuc;
    fnSuc = data;
    data = undefined;
  }
  if (typeof fnSuc != "function") {
    dataType = fnSuc;
    fnSuc = undefined;
  }
  return {
    url: url,
    data: data,
    fnSuc: fnSuc,
    dataType: dataType
  };
}
u.trim = function(str) {
  if (String.prototype.trim) {
    return str == null ? "" : String.prototype.trim.call(str);
  } else {
    return str.replace(/(^\s*)|(\s*$)/g, "");
  }
};
u.trimAll = function(str) {
  return str.replace(/\s*/g, "");
};
u.isElement = function(obj) {
  return !!(obj && obj.nodeType == 1);
};
u.isArray = function(obj) {
  if (Array.isArray) {
    return Array.isArray(obj);
  } else {
    return obj instanceof Array;
  }
};
u.isEmptyObject = function(obj) {
  if (JSON.stringify(obj) === "{}") {
    return true;
  }
  return false;
};
u.addEvt = function(el, name, fn, useCapture) {
  if (!u.isElement(el)) {
    console.warn(
      "$api.addEvt Function need el param, el param must be DOM Element"
    );
    return;
  }
  useCapture = useCapture || false;
  if (el.addEventListener) {
    el.addEventListener(name, fn, useCapture);
  }
};
u.rmEvt = function(el, name, fn, useCapture) {
  if (!u.isElement(el)) {
    console.warn(
      "$api.rmEvt Function need el param, el param must be DOM Element"
    );
    return;
  }
  useCapture = useCapture || false;
  if (el.removeEventListener) {
    el.removeEventListener(name, fn, useCapture);
  }
};
u.one = function(el, name, fn, useCapture) {
  if (!u.isElement(el)) {
    console.warn(
      "$api.one Function need el param, el param must be DOM Element"
    );
    return;
  }
  useCapture = useCapture || false;
  var that = this;
  var cb = function() {
    fn && fn();
    that.rmEvt(el, name, cb, useCapture);
  };
  that.addEvt(el, name, cb, useCapture);
};
u.dom = function(el, selector) {
  if (arguments.length === 1 && typeof arguments[0] == "string") {
    if (document.querySelector) {
      return document.querySelector(arguments[0]);
    }
  } else if (arguments.length === 2) {
    if (el.querySelector) {
      return el.querySelector(selector);
    }
  }
};
u.domAll = function(el, selector) {
  if (arguments.length === 1 && typeof arguments[0] == "string") {
    if (document.querySelectorAll) {
      return document.querySelectorAll(arguments[0]);
    }
  } else if (arguments.length === 2) {
    if (el.querySelectorAll) {
      return el.querySelectorAll(selector);
    }
  }
};
u.byId = function(id) {
  return document.getElementById(id);
};
u.first = function(el, selector) {
  if (arguments.length === 1) {
    if (!u.isElement(el)) {
      console.warn(
        "$api.first Function need el param, el param must be DOM Element"
      );
      return;
    }
    return el.children[0];
  }
  if (arguments.length === 2) {
    return this.dom(el, selector + ":first-child");
  }
};
u.last = function(el, selector) {
  if (arguments.length === 1) {
    if (!u.isElement(el)) {
      console.warn(
        "$api.last Function need el param, el param must be DOM Element"
      );
      return;
    }
    var children = el.children;
    return children[children.length - 1];
  }
  if (arguments.length === 2) {
    return this.dom(el, selector + ":last-child");
  }
};
u.eq = function(el, index) {
  return this.dom(el, ":nth-child(" + index + ")");
};
u.not = function(el, selector) {
  return this.domAll(el, ":not(" + selector + ")");
};
u.prev = function(el) {
  if (!u.isElement(el)) {
    console.warn(
      "$api.prev Function need el param, el param must be DOM Element"
    );
    return;
  }
  var node = el.previousSibling;
  if (node.nodeType && node.nodeType === 3) {
    node = node.previousSibling;
    return node;
  }
};
u.next = function(el) {
  if (!u.isElement(el)) {
    console.warn(
      "$api.next Function need el param, el param must be DOM Element"
    );
    return;
  }
  var node = el.nextSibling;
  if (node.nodeType && node.nodeType === 3) {
    node = node.nextSibling;
    return node;
  }
};
u.closest = function(el, selector) {
  if (!u.isElement(el)) {
    console.warn(
      "$api.closest Function need el param, el param must be DOM Element"
    );
    return;
  }
  var doms, targetDom;
  var isSame = function(doms, el) {
    var i = 0,
      len = doms.length;
    for (i; i < len; i++) {
      if (doms[i].isEqualNode(el)) {
        return doms[i];
      }
    }
    return false;
  };
  var traversal = function(el, selector) {
    doms = u.domAll(el.parentNode, selector);
    targetDom = isSame(doms, el);
    while (!targetDom) {
      el = el.parentNode;
      if (el != null && el.nodeType == el.DOCUMENT_NODE) {
        return false;
      }
      traversal(el, selector);
    }

    return targetDom;
  };

  return traversal(el, selector);
};
u.contains = function(parent, el) {
  var mark = false;
  if (el === parent) {
    mark = true;
    return mark;
  } else {
    do {
      el = el.parentNode;
      if (el === parent) {
        mark = true;
        return mark;
      }
    } while (el === document.body || el === document.documentElement);

    return mark;
  }
};
u.remove = function(el) {
  if (el && el.parentNode) {
    el.parentNode.removeChild(el);
  }
};
u.attr = function(el, name, value) {
  if (!u.isElement(el)) {
    console.warn(
      "$api.attr Function need el param, el param must be DOM Element"
    );
    return;
  }
  if (arguments.length == 2) {
    return el.getAttribute(name);
  } else if (arguments.length == 3) {
    el.setAttribute(name, value);
    return el;
  }
};
u.removeAttr = function(el, name) {
  if (!u.isElement(el)) {
    console.warn(
      "$api.removeAttr Function need el param, el param must be DOM Element"
    );
    return;
  }
  if (arguments.length === 2) {
    el.removeAttribute(name);
  }
};
u.hasCls = function(el, cls) {
  if (!u.isElement(el)) {
    console.warn(
      "$api.hasCls Function need el param, el param must be DOM Element"
    );
    return;
  }
  if (el.className.indexOf(cls) > -1) {
    return true;
  } else {
    return false;
  }
};
u.addCls = function(el, cls) {
  if (!u.isElement(el)) {
    console.warn(
      "$api.addCls Function need el param, el param must be DOM Element"
    );
    return;
  }
  if ("classList" in el) {
    el.classList.add(cls);
  } else {
    var preCls = el.className;
    var newCls = preCls + " " + cls;
    el.className = newCls;
  }
  return el;
};
u.removeCls = function(el, cls) {
  if (!u.isElement(el)) {
    console.warn(
      "$api.removeCls Function need el param, el param must be DOM Element"
    );
    return;
  }
  if ("classList" in el) {
    el.classList.remove(cls);
  } else {
    var preCls = el.className;
    var newCls = preCls.replace(cls, "");
    el.className = newCls;
  }
  return el;
};
u.toggleCls = function(el, cls) {
  if (!u.isElement(el)) {
    console.warn(
      "$api.toggleCls Function need el param, el param must be DOM Element"
    );
    return;
  }
  if ("classList" in el) {
    el.classList.toggle(cls);
  } else {
    if (u.hasCls(el, cls)) {
      u.removeCls(el, cls);
    } else {
      u.addCls(el, cls);
    }
  }
  return el;
};
u.val = function(el, val) {
  if (!u.isElement(el)) {
    console.warn(
      "$api.val Function need el param, el param must be DOM Element"
    );
    return;
  }
  if (arguments.length === 1) {
    switch (el.tagName) {
      case "SELECT":
        var value = el.options[el.selectedIndex].value;
        return value;
        break;
      case "INPUT":
        return el.value;
        break;
      case "TEXTAREA":
        return el.value;
        break;
    }
  }
  if (arguments.length === 2) {
    switch (el.tagName) {
      case "SELECT":
        el.options[el.selectedIndex].value = val;
        return el;
        break;
      case "INPUT":
        el.value = val;
        return el;
        break;
      case "TEXTAREA":
        el.value = val;
        return el;
        break;
    }
  }
};
u.prepend = function(el, html) {
  if (!u.isElement(el)) {
    console.warn(
      "$api.prepend Function need el param, el param must be DOM Element"
    );
    return;
  }
  el.insertAdjacentHTML("afterbegin", html);
  return el;
};
u.append = function(el, html) {
  if (!u.isElement(el)) {
    console.warn(
      "$api.append Function need el param, el param must be DOM Element"
    );
    return;
  }
  el.insertAdjacentHTML("beforeend", html);
  return el;
};
u.before = function(el, html) {
  if (!u.isElement(el)) {
    console.warn(
      "$api.before Function need el param, el param must be DOM Element"
    );
    return;
  }
  el.insertAdjacentHTML("beforebegin", html);
  return el;
};
u.after = function(el, html) {
  if (!u.isElement(el)) {
    console.warn(
      "$api.after Function need el param, el param must be DOM Element"
    );
    return;
  }
  el.insertAdjacentHTML("afterend", html);
  return el;
};
u.html = function(el, html) {
  if (!u.isElement(el)) {
    console.warn(
      "$api.html Function need el param, el param must be DOM Element"
    );
    return;
  }
  if (arguments.length === 1) {
    return el.innerHTML;
  } else if (arguments.length === 2) {
    el.innerHTML = html;
    return el;
  }
};
u.text = function(el, txt) {
  if (!u.isElement(el)) {
    console.warn(
      "$api.text Function need el param, el param must be DOM Element"
    );
    return;
  }
  if (arguments.length === 1) {
    return el.textContent;
  } else if (arguments.length === 2) {
    el.textContent = txt;
    return el;
  }
};
u.offset = function(el) {
  if (!u.isElement(el)) {
    console.warn(
      "$api.offset Function need el param, el param must be DOM Element"
    );
    return;
  }
  var sl = Math.max(
    document.documentElement.scrollLeft,
    document.body.scrollLeft
  );
  var st = Math.max(
    document.documentElement.scrollTop,
    document.body.scrollTop
  );

  var rect = el.getBoundingClientRect();
  return {
    l: rect.left + sl,
    t: rect.top + st,
    w: el.offsetWidth,
    h: el.offsetHeight
  };
};
u.css = function(el, css) {
  if (!u.isElement(el)) {
    console.warn(
      "$api.css Function need el param, el param must be DOM Element"
    );
    return;
  }
  if (typeof css == "string" && css.indexOf(":") > 0) {
    el.style && (el.style.cssText += ";" + css);
  }
};
u.cssVal = function(el, prop) {
  if (!u.isElement(el)) {
    console.warn(
      "$api.cssVal Function need el param, el param must be DOM Element"
    );
    return;
  }
  if (arguments.length === 2) {
    var computedStyle = window.getComputedStyle(el, null);
    return computedStyle.getPropertyValue(prop);
  }
};
u.jsonToStr = function(json) {
  if (typeof json === "object") {
    return JSON && JSON.stringify(json);
  }
};
u.strToJson = function(str) {
  if (typeof str === "string") {
    return JSON && JSON.parse(str);
  }
};
u.setStorage = function(key, value) {
  if (arguments.length === 2) {
    var v = value;
    if (typeof v == "object") {
      v = JSON.stringify(v);
      v = "obj-" + v;
    } else {
      v = "str-" + v;
    }
    var ls = uzStorage();
    if (ls) {
      ls.setItem(key, v);
    }
  }
};
u.getStorage = function(key) {
  var ls = uzStorage();
  if (ls) {
    var v = ls.getItem(key);
    if (!v) {
      return;
    }
    if (v.indexOf("obj-") === 0) {
      v = v.slice(4);
      return JSON.parse(v);
    } else if (v.indexOf("str-") === 0) {
      return v.slice(4);
    }
  }
};
u.rmStorage = function(key) {
  var ls = uzStorage();
  if (ls && key) {
    ls.removeItem(key);
  }
};
u.clearStorage = function() {
  var ls = uzStorage();
  if (ls) {
    ls.clear();
  }
};

/*by king*/
u.fixIos7Bar = function(el) {
  if (!u.isElement(el)) {
    console.warn(
      "$api.fixIos7Bar Function need el param, el param must be DOM Element"
    );
    return;
  }
  var strDM = api.systemType;
  if (strDM == "ios") {
    var strSV = api.systemVersion;
    var numSV = parseInt(strSV, 10);
    var fullScreen = api.fullScreen;
    var iOS7StatusBarAppearance = api.iOS7StatusBarAppearance;
    if (numSV >= 7 && !fullScreen && iOS7StatusBarAppearance) {
      el.style.paddingTop = "20px";
    }
  }
};
u.fixStatusBar = function(el) {
  if (!u.isElement(el)) {
    console.warn(
      "$api.fixStatusBar Function need el param, el param must be DOM Element"
    );
    return;
  }
  var sysType = api.systemType;
  if (sysType == "ios") {
    u.fixIos7Bar(el);
  } else if (sysType == "android") {
    var ver = api.systemVersion;
    ver = parseFloat(ver);
    if (ver >= 4.4) {
      el.style.paddingTop = "25px";
    }
  }
};
u.toast = function(title, text, time) {
  var opts = {};
  var show = function(opts, time) {
    api.showProgress(opts);
    setTimeout(function() {
      api.hideProgress();
    }, time);
  };
  if (arguments.length === 1) {
    var time = time || 500;
    if (typeof title === "number") {
      time = title;
    } else {
      opts.title = title + "";
    }
    show(opts, time);
  } else if (arguments.length === 2) {
    var time = time || 500;
    var text = text;
    if (typeof text === "number") {
      var tmp = text;
      time = tmp;
      text = null;
    }
    if (title) {
      opts.title = title;
    }
    if (text) {
      opts.text = text;
    }
    show(opts, time);
  }
  if (title) {
    opts.title = title;
  }
  if (text) {
    opts.text = text;
  }
  time = time || 500;
  show(opts, time);
};
u.post = function(/*url,data,fnSuc,dataType*/) {
  var argsToJson = parseArguments.apply(null, arguments);
  var json = {};
  var fnSuc = argsToJson.fnSuc;
  argsToJson.url && (json.url = argsToJson.url);
  argsToJson.data && (json.data = argsToJson.data);
  if (argsToJson.dataType) {
    var type = argsToJson.dataType.toLowerCase();
    if (type == "text" || type == "json") {
      json.dataType = type;
    }
  } else {
    json.dataType = "json";
  }
  json.method = "post";
  api.ajax(json, function(ret, err) {
    if (ret) {
      fnSuc && fnSuc(ret);
    }
  });
};
u.get = function(/*url,fnSuc,dataType*/) {
  var argsToJson = parseArguments.apply(null, arguments);
  var json = {};
  var fnSuc = argsToJson.fnSuc;
  argsToJson.url && (json.url = argsToJson.url);
  //argsToJson.data && (json.data = argsToJson.data);
  if (argsToJson.dataType) {
    var type = argsToJson.dataType.toLowerCase();
    if (type == "text" || type == "json") {
      json.dataType = type;
    }
  } else {
    json.dataType = "text";
  }
  json.method = "get";
  api.ajax(json, function(ret, err) {
    if (ret) {
      fnSuc && fnSuc(ret);
    }
  });
};

/*end*/

export default u;
